#include "TComando.h"

int Comando_Crear(TComando* comando, int longitud_maxima) {
	comando->operacion = (char*) malloc(longitud_maxima);
	comando->longitud_maxima = longitud_maxima;

	if ((comando != NULL) && (comando->operacion != NULL))
		return COMANDO_OK;
	else
		return COMANDO_ERR_MEMORIA;
}

int Comando_Destruir(TComando* comando) {
	int i;

	free(comando->operacion);

	for (i = 0; i < comando->cantidad_argumentos; i++) {
		free(comando->argumentos[i]);
	}

	return COMANDO_OK;
}

/* TODO: que aprenda a reconocer comillas y a meter lo que esta entre ellas en un solo argumento/string */
void parsear_argumentos(TComando* comando, char* argumentos) {
	int posicion_actual, posicion_inicial, indice_argumento, length, n;
	char caracter;

	length = strlen(argumentos);
	posicion_actual = indice_argumento = posicion_inicial = 0;
	caracter = argumentos[posicion_actual];

	while (caracter != '\0') {
		caracter = argumentos[posicion_actual];
		while ((caracter != ' ') && (caracter != '\0') && (caracter != '\"')) {
			caracter = argumentos[++posicion_actual];
		}
		if (caracter == '\"') {
			posicion_inicial = posicion_actual++;
			caracter = argumentos[posicion_actual];
			while (caracter != '\"') {
				caracter = argumentos[++posicion_actual];
			}
			n = posicion_actual - posicion_inicial;
			comando->argumentos[indice_argumento] = malloc(n);
			strncpy(comando->argumentos[indice_argumento], argumentos, n);
			posicion_inicial = ++posicion_actual;
			indice_argumento++;
		}
		else {
			n = posicion_actual - posicion_inicial;
			comando->argumentos[indice_argumento] = malloc(n);
			strncpy(comando->argumentos[indice_argumento], argumentos, n);
			posicion_inicial = ++posicion_actual;
			indice_argumento++;
		}
	}

	comando->cantidad_argumentos = indice_argumento;
}

int Comando_Leer(TComando* comando) {
	char operacion[LONGITUD_MAXIMA];
	char argumentos[LONGITUD_MAXIMA];

	printf("%c ", PROMPT_CHAR);
	scanf("%s", operacion);
	if ((!strcasecmp(operacion,"QUIT")==0) && (!strcasecmp(operacion,"HELP")==0) && (!strcasecmp(operacion,"RECV")==0)){
        scanf("%[A-Z, a-z, 0-9,  ]", argumentos);
        if ((strcasecmp(operacion,"CONNECT")==0) && (strcasecmp(operacion,"DISCONNECT")==0))
            parsear_argumentos(comando, argumentos);
        else
            *(comando->argumentos) = argumentos;
	}
    comando->operacion = operacion;
	return COMANDO_OK;
}

int Comando_ObtenerOperacion(TComando* comando, char** operacion) {
	*operacion = comando->operacion;
	return COMANDO_OK;
}

char* Comando_ObtenerArgumentos(TComando* comando, int indice, char* argumentos) {
	argumentos = comando->argumentos[indice];
	return comando->argumentos[indice];
}
